import java.util.*;

//3、我们知道我们的final修饰类之后呢，我们这个类就不能被继承了
//我们这里新增的就是sealed关键字，但是当我们使用permits就可以来使其对特定的开放
//但是我们开发的那个要用non-sealed修饰

//这里要注意的是，我们的sealed修饰的类要有子类
sealed class Animal permits Dog{

}
non-sealed class Dog extends Animal{

}
public class Test {
    //JDk17的新增的关键字
    public static void main(String[] args) {
        //4/instanceof关键字
        String str = new String("hello");
        String str2 = "hello word";
        if (str instanceof String) {
            //判断str是否是String类型的
        }
    }

    //2、var关键字 可以根据给的类型来判断是什么类型
    //为什么要有var关键字，因为有时候我们定义的类型是非常长的，比如我们的泛型
    //注意：var 不能声明字段
    //     var 不能声明方法的参数
    //     var 不能证明方法的返回参数
    public static void main4(String[] args) {
        var name = "zhangsan";
        var a = 20;
        //比如：
        Map<String, List<Map<Integer,String>>> complexMap1 = new HashMap<String, List<Map<Integer,String>>>();
        //这样是非常的长的，我们使用var关键字：
        var complexMap2 = new HashMap<String, List<Map<Integer,String>>>();
    }

    //1、yield 关键字用于从case中取出代码块的返回值
    public static void main3(String[] args) {
        String str = new String("hello");
        int reault = switch(str) {
            case "hello" : yield 1;
            case "word" : yield 2;
            case "hello word" : yield 3;
            default : yield -1;
        };
        System.out.println(reault);
    }
    public static void main2(String[] args) {
        //简化switch方法
        String str = new String("hello");
        int reault = switch(str) {
            case "hello" -> 1;
            case "word" -> 2;
            case "hello word" -> 3;
            default -> -1;
        };
        System.out.println(reault);
    }
    public static void main1(String[] args) {
        String str = new String("hello");
        int result = 0;
        switch(str) {
            case "hello" :
                result = 1;
                break;
            case "word" :
                result = 2;
                break;
            case "hello word" :
                result = 3;
                break;
            default:
                result = -1;
                break;
        }
        System.out.println(result);
    }
}
